Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Vertex buffer object</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Vertex_buffer_object"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Vertex_buffer_object rootpage-Vertex_buffer_object skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Vertex buffer object</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><style data-mw-deduplicate="TemplateStyles:r1251242444">
/* start https://en.wikipedia.org/ */


.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style>
<p>A <b>vertex buffer object</b> (<b>VBO</b>) is an <a href="OpenGL" title="OpenGL">OpenGL</a> feature that provides methods for uploading vertex data (<a href="Vertex_(geometry)" title="Vertex (geometry)">position</a>, <a href="Normal_vector" class="mw-redirect" title="Normal vector">normal vector</a>, color, etc.) to the video device for non-immediate-mode rendering. VBOs offer substantial performance gains over <a href="Immediate_mode_(computer_graphics)" title="Immediate mode (computer graphics)">immediate mode rendering</a> primarily because the data reside in video device memory rather than system memory and so it can be rendered directly by the video device. These are equivalent to <a href="Vertex_buffer" class="mw-redirect" title="Vertex buffer">vertex buffers</a> in <a href="Direct3D" title="Direct3D">Direct3D</a>.
</p><p>The vertex buffer object specification has been standardized by the <a rel="nofollow" class="external text" href="http://www.opengl.org/about/arb/">OpenGL Architecture Review Board</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20111124074301/http://www.opengl.org/about/arb/">Archived</a> 2011-11-24 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a> as of <a href="OpenGL" title="OpenGL">OpenGL</a> Version 1.5 (in 2003). Similar functionality was available before the standardization of VBOs via the <a href="Nvidia" title="Nvidia">Nvidia</a>-created extension "vertex array range"<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> or <a href="ATI_Technologies" title="ATI Technologies">ATI</a>'s "vertex array object"<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> extension.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Basic_VBO_functions">Basic VBO functions</h2></div>
<p>The following functions form the core of VBO access and manipulation:
</p>
<dl><dd>In OpenGL <b>1.4</b>:
<dl><dd><b>glGenBuffersARB</b>(sizei n, uint *buffers)</dd>
<dd>Generates a new VBO and returns its ID number as an unsigned integer. Id 0 is reserved.</dd></dl></dd></dl>
<dl><dd><dl><dd><b>glBindBufferARB</b>(enum target, uint buffer)</dd>
<dd>Use a previously created buffer as the active VBO.</dd></dl></dd></dl>
<dl><dd><dl><dd><b>glBufferDataARB</b>(enum target, sizeiptrARB size, const void *data, enum usage)</dd>
<dd>Upload data to the active VBO.</dd></dl></dd></dl>
<dl><dd><dl><dd><b>glDeleteBuffersARB</b>(sizei n, const uint *buffers)</dd>
<dd>Deletes the specified number of VBOs from the supplied array or VBO id.</dd></dl></dd></dl>
<dl><dd>In OpenGL <b>2.1</b>,<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> OpenGL <b>3.x</b><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> and OpenGL <b>4.x</b>:<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
<dl><dd><b>glGenBuffers</b>(sizei n, uint *buffers)</dd>
<dd>Generates a new VBO and returns its ID number as an unsigned integer. Id 0 is reserved.</dd></dl></dd></dl>
<dl><dd><dl><dd><b>glBindBuffer</b>(enum target, uint buffer)</dd>
<dd>Use a previously created buffer as the active VBO.</dd></dl></dd></dl>
<dl><dd><dl><dd><b>glBufferData</b>(enum target, sizeiptrARB size, const void *data, enum usage)</dd>
<dd>Upload data to the active VBO.</dd></dl></dd></dl>
<dl><dd><dl><dd><b>glDeleteBuffers</b>(sizei n, const uint *buffers)</dd>
<dd>Deletes the specified number of VBOs from the supplied array or VBO id.</dd></dl></dd></dl>
<div class="mw-heading mw-heading2"><h2 id="Example_usage">Example usage</h2></div>
<div class="mw-heading mw-heading3"><h3 id="In_C,_using_OpenGL_2.1">In C, using OpenGL 2.1</h3></div>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="c1">//Initialise VBO - do only once, at start of program</span>
<span class="c1">//Create a variable to hold the VBO identifier</span>
<span class="n">GLuint</span><span class="w"> </span><span class="n">triangleVBO</span><span class="p">;</span>

<span class="c1">//Vertices of a triangle (counter-clockwise winding)</span>
<span class="kt">float</span><span class="w"> </span><span class="n">data</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">-1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">-1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">};</span>
<span class="c1">//try float data[] = {0.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0}; if the above doesn't work.</span>

<span class="c1">//Create a new VBO and use the variable id to store the VBO id</span>
<span class="n">glGenBuffers</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">triangleVBO</span><span class="p">);</span>

<span class="c1">//Make the new VBO active</span>
<span class="n">glBindBuffer</span><span class="p">(</span><span class="n">GL_ARRAY_BUFFER</span><span class="p">,</span><span class="w"> </span><span class="n">triangleVBO</span><span class="p">);</span>

<span class="c1">//Upload vertex data to the video device</span>
<span class="n">glBufferData</span><span class="p">(</span><span class="n">GL_ARRAY_BUFFER</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">data</span><span class="p">),</span><span class="w"> </span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">GL_STATIC_DRAW</span><span class="p">);</span>

<span class="c1">//Make the new VBO active. Repeat here in case it has changed since initialisation</span>
<span class="n">glBindBuffer</span><span class="p">(</span><span class="n">GL_ARRAY_BUFFER</span><span class="p">,</span><span class="w"> </span><span class="n">triangleVBO</span><span class="p">);</span>

<span class="c1">//Draw Triangle from VBO - do each time window, view point or data changes</span>
<span class="c1">//Establish its 3 coordinates per vertex with zero stride in this array; necessary here</span>
<span class="n">glVertexPointer</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">GL_FLOAT</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>

<span class="c1">//Establish array contains vertices (not normals, colours, texture coords etc)</span>
<span class="n">glEnableClientState</span><span class="p">(</span><span class="n">GL_VERTEX_ARRAY</span><span class="p">);</span>

<span class="c1">//Actually draw the triangle, giving the number of vertices provided</span>
<span class="n">glDrawArrays</span><span class="p">(</span><span class="n">GL_TRIANGLES</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">data</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="kt">float</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">3</span><span class="p">);</span>

<span class="c1">//Force display to be drawn now</span>
<span class="n">glFlush</span><span class="p">();</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="In_C,_using_OpenGL_3.x_and_OpenGL_4.x">In C, using OpenGL 3.x and OpenGL 4.x</h3></div>
<p><b>Vertex Shader:</b>
</p>
<div class="mw-highlight mw-highlight-lang-glsl mw-content-ltr" dir="ltr"><pre><span class="cm">/*----------------- "exampleVertexShader.vert" -----------------*/</span>

<span class="cp">#version 150 // Specify which version of GLSL we are using.</span>

<span class="c1">// in_Position was bound to attribute index 0("shaderAttribute")</span>
<span class="k">in</span><span class="w"> </span><span class="kt">vec3</span><span class="w"> </span><span class="n">in_Position</span><span class="p">;</span>

<span class="kt">void</span><span class="w"> </span><span class="n">main</span><span class="p">()</span><span class="w"> </span>
<span class="p">{</span>
<span class="w"> </span><span class="nb">gl_Position</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">vec4</span><span class="p">(</span><span class="n">in_Position</span><span class="p">.</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">in_Position</span><span class="p">.</span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">in_Position</span><span class="p">.</span><span class="n">z</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">);</span>
<span class="p">}</span>
<span class="cm">/*--------------------------------------------------------------*/</span>
</pre></div>
<p><br>
<b>Fragment Shader:</b>
</p>
<div class="mw-highlight mw-highlight-lang-glsl mw-content-ltr" dir="ltr"><pre><span class="cm">/*---------------- "exampleFragmentShader.frag" ----------------*/</span>

<span class="cp">#version 150 // Specify which version of GLSL we are using.</span>

<span class="k">precision</span><span class="w"> </span><span class="k">highp</span><span class="w"> </span><span class="kt">float</span><span class="p">;</span><span class="w"> </span><span class="c1">// Video card drivers require this line to function properly</span>

<span class="k">out</span><span class="w"> </span><span class="kt">vec4</span><span class="w"> </span><span class="n">fragColor</span><span class="p">;</span>

<span class="kt">void</span><span class="w"> </span><span class="n">main</span><span class="p">()</span><span class="w"> </span>
<span class="p">{</span>
<span class="w"> </span><span class="n">fragColor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">vec4</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span><span class="mf">1.0</span><span class="p">,</span><span class="mf">1.0</span><span class="p">,</span><span class="mf">1.0</span><span class="p">);</span><span class="w"> </span><span class="c1">//Set colour of each fragment to WHITE</span>
<span class="p">}</span>
<span class="cm">/*--------------------------------------------------------------*/</span>
</pre></div>
<p><br>
<b>Main OpenGL Program:</b>
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="cm">/*--------------------- Main OpenGL Program ---------------------*/</span>

<span class="cm">/* Create a variable to hold the VBO identifier */</span>
<span class="n">GLuint</span><span class="w"> </span><span class="n">triangleVBO</span><span class="p">;</span>
<span class="w"> </span>
<span class="cm">/* This is a handle to the shader program */</span>
<span class="n">GLuint</span><span class="w"> </span><span class="n">shaderProgram</span><span class="p">;</span>

<span class="cm">/* These pointers will receive the contents of our shader source code files */</span>
<span class="n">GLchar</span><span class="w"> </span><span class="o">*</span><span class="n">vertexSource</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">fragmentSource</span><span class="p">;</span>

<span class="cm">/* These are handles used to reference the shaders */</span>
<span class="n">GLuint</span><span class="w"> </span><span class="n">vertexShader</span><span class="p">,</span><span class="w"> </span><span class="n">fragmentShader</span><span class="p">;</span>

<span class="k">const</span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">shaderAttribute</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>

<span class="cm">/* Vertices of a triangle (counter-clockwise winding) */</span>
<span class="kt">float</span><span class="w"> </span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mf">-1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">-1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">-1.0</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="w"> </span><span class="p">}</span>
<span class="p">};</span>

<span class="cm">/*---------------------- Initialise VBO - (Note: do only once, at start of program) ---------------------*/</span>
<span class="cm">/* Create a new VBO and use the variable "triangleVBO" to store the VBO id */</span>
<span class="n">glGenBuffers</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">triangleVBO</span><span class="p">);</span>

<span class="cm">/* Make the new VBO active */</span>
<span class="n">glBindBuffer</span><span class="p">(</span><span class="n">GL_ARRAY_BUFFER</span><span class="p">,</span><span class="w"> </span><span class="n">triangleVBO</span><span class="p">);</span>

<span class="cm">/* Upload vertex data to the video device */</span>
<span class="n">glBufferData</span><span class="p">(</span><span class="n">GL_ARRAY_BUFFER</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">data</span><span class="p">),</span><span class="w"> </span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">GL_STATIC_DRAW</span><span class="p">);</span>

<span class="cm">/* Specify that our coordinate data is going into attribute index 0(shaderAttribute), and contains three floats per vertex */</span>
<span class="n">glVertexAttribPointer</span><span class="p">(</span><span class="n">shaderAttribute</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">GL_FLOAT</span><span class="p">,</span><span class="w"> </span><span class="n">GL_FALSE</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>

<span class="cm">/* Enable attribute index 0(shaderAttribute) as being used */</span>
<span class="n">glEnableVertexAttribArray</span><span class="p">(</span><span class="n">shaderAttribute</span><span class="p">);</span>

<span class="cm">/* Make the new VBO active. */</span>
<span class="n">glBindBuffer</span><span class="p">(</span><span class="n">GL_ARRAY_BUFFER</span><span class="p">,</span><span class="w"> </span><span class="n">triangleVBO</span><span class="p">);</span>
<span class="cm">/*-------------------------------------------------------------------------------------------------------*/</span>

<span class="cm">/*--------------------- Load Vertex and Fragment shaders from files and compile them --------------------*/</span>
<span class="cm">/* Read our shaders into the appropriate buffers */</span>
<span class="n">vertexSource</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">filetobuf</span><span class="p">(</span><span class="s">"exampleVertexShader.vert"</span><span class="p">);</span>
<span class="n">fragmentSource</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">filetobuf</span><span class="p">(</span><span class="s">"exampleFragmentShader.frag"</span><span class="p">);</span>

<span class="cm">/* Assign our handles a "name" to new shader objects */</span>
<span class="n">vertexShader</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">glCreateShader</span><span class="p">(</span><span class="n">GL_VERTEX_SHADER</span><span class="p">);</span>
<span class="n">fragmentShader</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">glCreateShader</span><span class="p">(</span><span class="n">GL_FRAGMENT_SHADER</span><span class="p">);</span>

<span class="cm">/* Associate the source code buffers with each handle */</span>
<span class="n">glShaderSource</span><span class="p">(</span><span class="n">vertexShader</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">GLchar</span><span class="o">**</span><span class="p">)</span><span class="o">&amp;</span><span class="n">vertexSource</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="n">glShaderSource</span><span class="p">(</span><span class="n">fragmentShader</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">GLchar</span><span class="o">**</span><span class="p">)</span><span class="o">&amp;</span><span class="n">fragmentSource</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>

<span class="cm">/* Free the temporary allocated memory */</span>
<span class="n">free</span><span class="p">(</span><span class="n">vertexSource</span><span class="p">);</span>
<span class="n">free</span><span class="p">(</span><span class="n">fragmentSource</span><span class="p">);</span>

<span class="cm">/* Compile our shader objects */</span>
<span class="n">glCompileShader</span><span class="p">(</span><span class="n">vertexShader</span><span class="p">);</span>
<span class="n">glCompileShader</span><span class="p">(</span><span class="n">fragmentShader</span><span class="p">);</span>
<span class="cm">/*-------------------------------------------------------------------------------------------------------*/</span>

<span class="cm">/*-------------------- Create shader program, attach shaders to it and then link it ---------------------*/</span>
<span class="cm">/* Assign our program handle a "name" */</span>
<span class="n">shaderProgram</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">glCreateProgram</span><span class="p">();</span>

<span class="cm">/* Attach our shaders to our program */</span>
<span class="n">glAttachShader</span><span class="p">(</span><span class="n">shaderProgram</span><span class="p">,</span><span class="w"> </span><span class="n">vertexShader</span><span class="p">);</span>
<span class="n">glAttachShader</span><span class="p">(</span><span class="n">shaderProgram</span><span class="p">,</span><span class="w"> </span><span class="n">fragmentShader</span><span class="p">);</span>

<span class="cm">/* Bind attribute index 0 (shaderAttribute) to in_Position*/</span>
<span class="cm">/* "in_Position" will represent "data" array's contents in the vertex shader */</span>
<span class="n">glBindAttribLocation</span><span class="p">(</span><span class="n">shaderProgram</span><span class="p">,</span><span class="w"> </span><span class="n">shaderAttribute</span><span class="p">,</span><span class="w"> </span><span class="s">"in_Position"</span><span class="p">);</span>

<span class="cm">/* Link shader program*/</span>
<span class="n">glLinkProgram</span><span class="p">(</span><span class="n">shaderProgram</span><span class="p">);</span>
<span class="cm">/*-------------------------------------------------------------------------------------------------------*/</span>

<span class="cm">/* Set shader program as being actively used */</span>
<span class="n">glUseProgram</span><span class="p">(</span><span class="n">shaderProgram</span><span class="p">);</span>

<span class="cm">/* Set background colour to BLACK */</span>
<span class="n">glClearColor</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">);</span>

<span class="cm">/* Clear background with BLACK colour */</span>
<span class="n">glClear</span><span class="p">(</span><span class="n">GL_COLOR_BUFFER_BIT</span><span class="p">);</span>

<span class="cm">/* Actually draw the triangle, giving the number of vertices provided by invoke glDrawArrays</span>
<span class="cm"> while telling that our data is a triangle and we want to draw 0-3 vertexes </span>
<span class="cm">*/</span>
<span class="n">glDrawArrays</span><span class="p">(</span><span class="n">GL_TRIANGLES</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">data</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">GLfloat</span><span class="p">));</span>
<span class="cm">/*---------------------------------------------------------------*/</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist reflist-columns references-column-width reflist-columns-2">
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20040817124345/http://developer.nvidia.com/attach/7062">"GL_NV_vertex_array_range Whitepaper"</a>. Archived from the original on 2004-08-17<span class="reference-accessdate">. Retrieved <span class="nowrap">2024-06-24</span></span>.</cite><span class="cs1-maint citation-comment"><code class="cs1-code">{{cite web}}</code>: CS1 maint: bot: original URL status unknown (link)</span></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20120704064126/http://oss.sgi.com/projects/ogl-sample/registry/ATI/vertex_array_object.txt">"ATI_vertex_array_object"</a>. Archived from <a rel="nofollow" class="external text" href="http://oss.sgi.com/projects/ogl-sample/registry/ATI/vertex_array_object.txt">the original</a> on 2012-07-04<span class="reference-accessdate">. Retrieved <span class="nowrap">2011-08-12</span></span>.</cite></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20080217231212/http://www.opengl.org/sdk/docs/man/xhtml/">"OpenGL 2.1 function reference"</a>. Archived from <a rel="nofollow" class="external text" href="http://www.opengl.org/sdk/docs/man/xhtml/">the original</a> on 2008-02-17<span class="reference-accessdate">. Retrieved <span class="nowrap">2008-02-11</span></span>.</cite></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.opengl.org/sdk/docs/man3/">"OpenGL 3.3 function reference"</a>.</cite></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20130715225135/http://www.opengl.org/wiki/Category:Core_API_Reference">"OpenGL 4.2 function reference"</a>. Archived from <a rel="nofollow" class="external text" href="http://www.opengl.org/wiki/Category:Core_API_Reference">the original</a> on 2013-07-15<span class="reference-accessdate">. Retrieved <span class="nowrap">2012-04-06</span></span>.</cite></span>
</li>
</ol></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_vertex_buffer_object.txt">Vertex Buffer Object Whitepaper</a></li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-08-02" href="https://en.wikipedia.org/wiki/?title=Vertex_buffer_object&amp;oldid=1303780438">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>